package org.onionframework.faces.web.action;

import java.io.Serializable;
import java.util.List;

import org.onionframework.faces.model.DataProvider;
import org.onionframework.faces.model.DefaultPagedDataModel;
import org.onionframework.faces.model.PagedDataModel;
import org.onionframework.persistence.model.Model;
import org.onionframework.persistence.query.OnionQuery;
import org.onionframework.persistence.service.GenericService;

public class OnionAction<T extends Model<? extends Serializable>> extends GenericAction<T> implements Serializable{

	private static final long serialVersionUID = 7169622414305330024L;

	protected PagedDataModel datas;			//用于列表展现的数据

	public OnionAction(){}
	
	public OnionAction(Class<T> entityClass){
		this.entityClass = entityClass;
	}
	
	/**
	 * 初始化数据，页面上有查询的action可以覆盖这个方法
	 * 
	 * @param onionQuery
	 * @param sortProperties
	 */
	protected void initDatas(OnionQuery onionQuery) {
		this.datas = this.findPage(onionQuery);
	}
	
	@Override
	public Object getDatas() {
		return this.datas;
	}
	
	/**
	 * 使用Service分页查询数据
	 * @param onionQuery 包含了投影、条件等信息的对象
	 * @param sortProperties 排序信息
	 * @return 
	 * 	注意，由于JSF的结构，这里返回的其实并不是真正的查询结果，而是一种查询数据的能力。
	 * 	这种能力返回给JSF的页面组件作为value，页面渲染的时候使用这个能力来获取数据
	 */
	protected PagedDataModel findPage(final OnionQuery onionQuery) {
		return this.findPage(onionQuery, this.getService());
	}
	
	protected PagedDataModel findPage(final OnionQuery onionQuery, final GenericService<?> service) {
		int count = this.getService().count(onionQuery).intValue();
		return new DefaultPagedDataModel(count, new DataProvider(){
			@Override
			public List<?> getList(int firstRow, int maxResults) {
				return service.find(onionQuery.start(firstRow).limit(maxResults));
			}
		});
	}

}
